package com.mazaiting.manager.controller;

import com.mazaiting.common.core.domain.result.Option;
import com.mazaiting.common.core.ex.exceptions.BaseException;
import com.mazaiting.common.core.ex.exceptions.BusinessException;
import com.mazaiting.common.core.ex.exceptions.EmptyObjectException;
import com.mazaiting.manager.domain.form.RoleForm;
import com.mazaiting.manager.domain.form.RoleResourceForm;
import com.mazaiting.manager.domain.query.RolePageQuery;
import com.mazaiting.manager.domain.vo.role.RolePageVO;
import com.mazaiting.manager.domain.vo.role.SysRoleDetailVO;
import com.mazaiting.manager.service.ISysRoleService;
import com.mazaiting.mybatisplus.domain.vo.BasePageVO;
import com.mazaiting.web.auth.security.annotation.PrePermission;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/**
 * 角色控制器
 *
 * @author mazaiting
 * @since 2022-03-22
 */
@Validated
@RestController
@RequestMapping("/manager/v1/roles")
@RequiredArgsConstructor
public class SysRoleController {

    private final ISysRoleService sysRoleService;

    /**
     * 角色分页列表
     * @param queryParams 查询参数
     * @return 分页数据
     */
    @PrePermission("sys:role:query")
    @GetMapping("/pages")
    public BasePageVO<RolePageVO> listRolePages(RolePageQuery queryParams) throws EmptyObjectException {
        return sysRoleService.listRolePages(queryParams);
    }

    /**
     * 角色下拉列表
     * @return 角色列表
     */
    @GetMapping("/options")
    public List<Option<Long>> listRoleOptions() throws EmptyObjectException {
        return sysRoleService.listRoleOptions();
    }

    /**
     * 角色详情
     * @param roleId 角色 ID
     * @return 角色信息
     */
    @PrePermission("sys:role:update")
    @GetMapping("/{roleId}")
    public SysRoleDetailVO getRoleDetail(@PathVariable Long roleId) throws EmptyObjectException {
        return sysRoleService.findById(roleId);
    }

    /**
     * 新增角色
     * @param roleForm 角色表单
     * @return true: 新增成功; false: 新增失败
     */
    @PrePermission("sys:role:add")
    @PostMapping
    public boolean add(@Valid RoleForm roleForm) throws BusinessException {
        return sysRoleService.save(roleForm);
    }

    /**
     * 修改角色
     * @param roleForm 角色表单
     * @return true: 修改成功; false: 修改失败
     */
    @PrePermission("sys:role:update")
    @PutMapping
    public boolean update(@Valid RoleForm roleForm) throws BaseException {
        return sysRoleService.update(roleForm);
    }

    /**
     * 删除角色
     * @param ids ID 列表. 删除角色，多个以英文逗号(,)分割
     * @return true: 删除成功; false: 删除失败
     */
    @PrePermission("sys:role:delete")
    @DeleteMapping("/{ids}")
    public boolean deleteRoles(@PathVariable String ids) throws BusinessException {
        return sysRoleService.delete(ids);
    }
//
//    @ApiOperation(value = "修改角色状态")
//    @PutMapping(value = "/{roleId}/status")
//    public Result updateRoleStatus(
//            @ApiParam("角色ID") @PathVariable Long roleId,
//            @ApiParam("角色状态:1-正常；0-禁用") @RequestParam Integer status
//    ) {
//        boolean result = sysRoleService.updateRoleStatus(roleId, status);
//        return Result.judge(result);
//    }
//

    /**
     * 获取角色的资源ID集合-资源包括菜单和权限ID
     * @param roleId 角色 ID
     * @return 获取角色的资源ID集合
     */
    @PrePermission("sys:role:query_res")
    @GetMapping("/{roleId}/resources")
    public RoleResourceForm getRoleResources(@PathVariable Long roleId) {
        return sysRoleService.getRoleResources(roleId);
    }

    /**
     * 分配角色的资源权限
     * @param roleId 角色 ID
     * @param roleResourceForm 角色资源表单
     * @return true: 修改成功; false: 修改失败
     */
    @PrePermission("sys:role:update_res")
    @PutMapping("/{roleId}/resources")
    public boolean updateRoleResource(@PathVariable Long roleId, RoleResourceForm roleResourceForm) {
         return sysRoleService.updateRoleResource(roleId,roleResourceForm);
    }

}
